/*
 * Delay.c
 *
 *  Created on: Jun 17, 2024
 *      Author: 17850
 */


#include "Delay.h"

// void Delay_1us (unsigned char t)
//-----------------------------------------------------------------
// 函数功能: 时基为1us的延时
// 入口参数: 无符号8bit整数
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项:  时钟周期：1/72mhz
//            目标1us:-->要72个时钟周期
//            -->要观察执行了Delay_1us函数前后的state差是否为72个周期
//            -->通过多次更改，使得误差越来越小
/*
//i=7,测得延时如下：(SYSCLK=72MHz)
                        延时个数       延时          误差
    Delay_1us(1):           70        972ns         28ns
    Delay_1us(2):           131       1.819us       181ns
    Delay_1us(10):          619       8.5972us      1.4us
    Delay_1us(20):         1229       17.069us      2.9us
    Delay_1us(100):        6109       84.84us       15.16us

    i=4!!!          i=9        i=8
    1us：1us        1.98us!    1.88us
    5us:3,22us      5.6us      5.16us
    10us:6us        10.86us    9.89us
    50us:28.22us    52.5us     47.6us
    100us:          104.6us    95.4us
    200us:          209us      189.5
    500us:          522us      478us
    结论:i=9,误差+4.6%，1us延时误差大
         i=8,误差-4.6%，1us延时误差大
*/
//-----------------------------------------------------------------
void Delay_1us(uint8_t t)
{
	uint8_t i = 0;

  do
  {
    i = 8; // i=7,t=0.986us,误差14ns
    do
    {
    } while (--i);
  } while (--t);
}

//-----------------------------------------------------------------
// void Delay_5ms (unsigned char t)
//-----------------------------------------------------------------
//
// 函数功能: 时基为5ms的延时
// 入口参数: 无符号8bit整数
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项:
/*
   j=625,u=63,测得延时如下：(SYSCLK=72MHz)
                              延时个数        延时      误差
        Delay_5ms(1):         360166       5.0023ms     2us
        Delay_5ms(2):         720324       10.004ms     4us
        Delay_5ms(5):         1800795      25.011ms    11us
        Delay_5ms(10):        3601588      50.022ms    22us
        Delay_5ms(20):        7203168     100.044ms    44us
        Delay_5ms(40):       14406118     200.084ms    84us
        Delay_5ms(100):      36015742     500.218ms   218us
*/
//-----------------------------------------------------------------
void Delay_5ms(uint8_t t)
{
	uint16_t i, j;

  do
  {
    j = 625; //j=625,u=63,误差2.30us
    do
    {
      i = 63;
      do
      {
      } while (--i);
    } while (--j);
  } while (--t);
}
//-----------------------------------------------------------------
// void Delay_1ms (unsigned char t)
//-----------------------------------------------------------------
//
// 函数功能: 时基为1ms的延时
// 入口参数: 无符号8bit整数
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项:
/*
   手工延时：
   j=119,u=67,测得延时如下：(SYSCLK=72MHz)
                            延时个数          延时      误差
        Delay_1ms(1):       72158          1.002ms     2us
        Delay_1ms(2):       144304         2.004ms     4us
        Delay_1ms(5):       360752         5.010ms     10us
        Delay_1ms(10):      721498        10.020ms     20us
        Delay_1ms(20):      1442989       20.041ms     41us
        Delay_1ms(40):      2885874       40.082ms     82us
        Delay_1ms(100):     7214936      100.207ms     207us
*/
//-----------------------------------------------------------------
void Delay_1ms(uint8_t t)
{
  uint16_t i, j;

  do
  {
    j = 119;
    do
    {
      i = 67; // 1.002278ms ,误差2us
      do
      {
      } while (--i); //
    } while (--j);
  } while (--t);
}
//-----------------------------------------------------------------
// void Delay_50ms (u8 t)
//-----------------------------------------------------------------
//
// 函数功能: 时基为50ms的延时
// 例子提示: 调用Delay_50ms(20),得到1s延时
// 入口参数: 无符号8bit整数
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项:
/*
  j=1000,i=513,测得以下延时: (SYSCLK=72MHz)
                          时钟个数          延时       误差
      Delay_50ms(1):      3599596         49.994ms      6us
      Delay_50ms(2):      7199150         99.988ms      12us
      Delay_50ms(5):      17997911       249.970ms      30us
      Delay_50ms(10):     35995845       499.942ms      58us
      Delay_50ms(20):     71991715       999.885ms      115us
      Delay_50ms(40):     143983456     1999.770ms      230us
      Delay_50ms(100):    359958683     4999.426ms      574us
*/
//-----------------------------------------------------------------
void Delay_50ms(uint8_t t)
{
	uint16_t i, j;

  do
  {
    j = 1000; // j=1000,i=513-->6us
    do
    {
      i = 513;
      do
      {
      } while (--i);
    } while (--j);
  } while (--t);
}
